package Logica;

import Persistencia.ControladoraPersistencia;
import Persistencia.exceptions.NonexistentEntityException;
import Persistencia.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.sql.Time;
import java.util.Calendar;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class Empresa implements Serializable {

    private String razonSocial;
    private String direccion;
    private long telefono;
    private String email;
    private List<Persona> personas;
    private List<Marca> marcas;
    private List<Modelo> modelos;
    private List<Segmento> segmentos;
    private Set especialidades;
    private List<Taller> talleres;
    private List<Proveedor> proveedores;
    private List<Severidad> severidades;
    private List<PedidoRepuesto> pedidos;
    private List<Vehiculo> vehiculos;
    private List<Repuesto> repuestos;
    private Set importancias;
    private List<EstadoVehiculo> estadosVehiculo;
    private List<Reparacion> reparaciones;
    private List<Localidad> localidades;

    private List<Turno> turnos;
    private List<Operacion> operaciones;
    private List<TipoOperacion> tiposOperacion;
    private List<Garantia> garantias;
    private List<EstadoEjecucion> estadosEjecucion;
    
    
    public Empresa() {
        this.razonSocial = razonSocial;
        this.direccion = direccion;
        this.telefono = telefono;
        this.email = email;
        this.personas = new LinkedList();
        this.marcas = new LinkedList();
        this.modelos = new LinkedList();
        this.segmentos = new LinkedList();

        this.especialidades = new HashSet();
        this.talleres = new LinkedList();
        this.proveedores = new LinkedList();
        this.severidades = new LinkedList();
        this.vehiculos = new LinkedList();
        this.pedidos = new LinkedList();
        this.repuestos = new LinkedList();
        this.importancias = new HashSet();
        this.turnos = new LinkedList();
        this.operaciones = new LinkedList();
        this.tiposOperacion = new LinkedList();
        this.garantias = new LinkedList();
        this.estadosEjecucion = new LinkedList();
    }
    ControladoraPersistencia miPersistencia = new ControladoraPersistencia();

    public Empresa(String razonSocial, String direccion, long telefono, String email) {
        this.razonSocial = razonSocial;
        this.direccion = direccion;
        this.telefono = telefono;
        this.email = email;
        this.personas = new LinkedList();
        this.marcas = new LinkedList();
        this.modelos = new LinkedList();
        this.segmentos = new LinkedList();
        this.garantias = new LinkedList();
        this.especialidades = new HashSet();
        this.talleres = new LinkedList();
        this.proveedores = new LinkedList();
        this.severidades = new LinkedList();
        this.vehiculos = new LinkedList();
        this.pedidos = new LinkedList();
        this.repuestos = new LinkedList();
        this.importancias = new HashSet();
    }

    public String getRazonSocial() {
        return razonSocial;
    }

    public String getDireccion() {
        return direccion;
    }

    public long getTelefono() {
        return telefono;
    }

    public String getEmail() {
        return email;
    }

    public void setRazonSocial(String razonSocial) {
        this.razonSocial = razonSocial;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public void setTelefono(long telefono) {
        this.telefono = telefono;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Persona> getPersonas() {
        return personas;
    }

    public void setPersonas(List<Persona> personas) {
        this.personas = personas;
    }

    public List<Marca> getMarcas() {
        return marcas;
    }

    public void setMarcas(List<Marca> marcas) {
        this.marcas = marcas;
    }

    public List<Modelo> getModelos() {
        return modelos;
    }

    public void setModelos(List<Modelo> modelos) {
        this.modelos = modelos;
    }

    public List<Segmento> getSegmentos() {
        return segmentos;
    }

    public void setSegmentos(List<Segmento> segmentos) {
        this.segmentos = segmentos;
    }

    public Set getEspecialidades() {
        return especialidades;
    }

    public void setEspecialidades(Set especialidades) {
        this.especialidades = especialidades;
    }

    public List<Taller> getTalleres() {
        return talleres;
    }

    public void setTalleres(List<Taller> talleres) {
        this.talleres = talleres;
    }

    public List<Proveedor> getProveedores() {
        return proveedores;
    }

    public void setProveedores(List<Proveedor> proveedores) {
        this.proveedores = proveedores;
    }

    public List<Severidad> getSeveridades() {
        return severidades;
    }

    public void setSeveridades(List<Severidad> severidades) {
        this.severidades = severidades;
    }

    public List<PedidoRepuesto> getPedidos() {
        return pedidos;
    }

    public void setPedidos(List<PedidoRepuesto> pedidos) {
        this.pedidos = pedidos;
    }

    public List<Vehiculo> getVehiculos() {
        return vehiculos;
    }

    public void setVehiculos(List<Vehiculo> vehiculos) {
        this.vehiculos = vehiculos;
    }

    public List<Repuesto> getRepuestos() {
        return repuestos;
    }

    public void setRepuestos(List<Repuesto> repuestos) {
        this.repuestos = repuestos;
    }

    public Set getImportancias() {
        return importancias;
    }

    public void setImportancias(Set importancias) {
        this.importancias = importancias;
    }

    @Override
    public String toString() {
        return "Nombre Empresa: " + this.razonSocial;
    }

    public void setEstadosVehiculo(List<EstadoVehiculo> estadosVehiculo) {
        this.estadosVehiculo = estadosVehiculo;
    }

    public void setReparaciones(List<Reparacion> reparaciones) {
        this.reparaciones = reparaciones;
    }

    public void setLocalidades(List<Localidad> localidades) {
        this.localidades = localidades;
    }

    public void setTurnos(List<Turno> turnos) {
        this.turnos = turnos;
    }

    public void setOperaciones(List<Operacion> operaciones) {
        this.operaciones = operaciones;
    }

    public void setTiposOperacion(List<TipoOperacion> tiposOperacion) {
        this.tiposOperacion = tiposOperacion;
    }

    public void setGarantias(List<Garantia> garantias) {
        this.garantias = garantias;
    }

    public List<EstadoVehiculo> getEstadosVehiculo() {
        return estadosVehiculo;
    }

    public List<Reparacion> getReparaciones() {
        return reparaciones;
    }

    public List<Localidad> getLocalidades() {
        return localidades;
    }

    public List<Turno> getTurnos() {
        return turnos;
    }

    public List<Operacion> getOperaciones() {
        return operaciones;
    }

    public List<TipoOperacion> getTiposOperacion() {
        return tiposOperacion;
    }

    public List<Garantia> getGarantias() {
        return garantias;
    }

    public void altaEmpleado(int nroLegajo, CategoriaEmp unaCategoriaEmp, String nombre, String apellido, Calendar fechaNacimiento,
            double nroDoc, String domicilio, long telefono, Set<Especialidad> especialidades) throws PreexistingEntityException, Exception {
        Empleado unEmpleado = new Empleado(nroLegajo, unaCategoriaEmp, nombre, apellido, fechaNacimiento, nroDoc, domicilio, telefono);
        unEmpleado.setEspecialidades(especialidades);
        personas.add(unEmpleado);
        miPersistencia.crearEmpleado(unEmpleado);
        System.out.println(unEmpleado.getEspecialidades());


    }

    public Cliente altaCliente(int nroCliente, String nombre, String apellido, Calendar fechaNacimiento, double nroDoc, String domicilio,
            long telefono, List<Vehiculo> vehiculos,Localidad loc) throws PreexistingEntityException, Exception {
        //HashMap<String, Vehiculo> vehiculos = new HashMap();
        //List<Cliente> clientes = new LinkedList();

        Cliente unCliente = new Cliente();
        unCliente.setApellido(apellido);
        unCliente.setDomicilio(domicilio);
        unCliente.setNombre(nombre);
        unCliente.setNroCliente(nroCliente);
        unCliente.setFechaNacimiento(fechaNacimiento);
        unCliente.setNroDoc(nroDoc);
        unCliente.setTelefono(telefono);
        unCliente.setVehiculos(vehiculos);
        unCliente.setUnaLocalidad(loc);
        personas.add(unCliente);
        System.out.println(unCliente.getVehiculos());
        miPersistencia.crearCliente(unCliente);
        return unCliente;
    }

    public Marca altaMarca(String nombre) throws PreexistingEntityException, Exception {

        Marca unaMarca = new Marca(nombre);
        marcas.add(unaMarca);
        miPersistencia.crearMarca(unaMarca);
        return unaMarca;
    }

    public Modelo altaModelo(String nombre, Marca unaMarca, Segmento unSegmento) throws PreexistingEntityException, Exception {

        Modelo unModelo = new Modelo(nombre, unaMarca, unSegmento);

        modelos.add(unModelo);
        miPersistencia.crearModelo(unModelo);
        return unModelo;
    }

    public Segmento altaSegmento(String nombre, Modelo unModelo) throws PreexistingEntityException, Exception {

        Segmento unSegmento = new Segmento(nombre);

        segmentos.add(unSegmento);
        miPersistencia.crearSegmento(unSegmento);
        return unSegmento;
    }

    public Vehiculo altaVehiculo(String dominio, String nroChasis, String nroMotor, Integer anio, Integer kilometrosRec, String equipamiento,
            Calendar fechaCompra, Modelo unModelo, Garantia unaGarantia, Turno unTurno, Cliente unCliente) throws PreexistingEntityException, Exception {

        Vehiculo unVehiculo = new Vehiculo(dominio, nroChasis, nroMotor, anio, kilometrosRec, equipamiento, fechaCompra, unModelo,
                unaGarantia, unTurno, unCliente);

        vehiculos.add(unVehiculo);
        miPersistencia.crearVehiculo(unVehiculo);
        return unVehiculo;
    }

    public Especialidad altaEspecialidad(String nombre, Empleado unEmpleado) throws PreexistingEntityException, Exception {

        Especialidad unaEspecialidad = new Especialidad(nombre, unEmpleado);

        especialidades.add(unaEspecialidad);
        miPersistencia.crearEspecialidad(unaEspecialidad);
        return unaEspecialidad;
    }

    public void altaTaller(int nroTaller, String direccion, String nombre, String telefono, Localidad unaLocalidad,
            List<Localidad> zonasCobertura) throws PreexistingEntityException, Exception {


        Taller unTaller = new Taller(nroTaller, direccion, nombre, telefono, unaLocalidad);

        unTaller.setZonasCobertura(zonasCobertura);
        talleres.add(unTaller);
        miPersistencia.crearTaller(unTaller);
    }

    public void altaProveedor(String razonSocial, String domicilio, long telefono, Taller unTaller) throws PreexistingEntityException, Exception {

        Proveedor unProveedor = new Proveedor(razonSocial, domicilio, telefono, unTaller);

        proveedores.add(unProveedor);
        miPersistencia.crearProveedor(unProveedor);
    }

    public Severidad altaSeveridad(int nivel) throws PreexistingEntityException, Exception {

        Severidad unaSeveridad = new Severidad(nivel);

        severidades.add(unaSeveridad);
        miPersistencia.crearSeveridad(unaSeveridad);
        return unaSeveridad;
    }

    public void altaPedidoRepuesto(int nroPedido, String descripcion, boolean autorizado, boolean recambio, int cantidadPedida,
            Importancia unaImportancia, Empleado unEmpleado, Repuesto unRepuesto, Vehiculo unVehiculo) throws PreexistingEntityException, Exception {

        PedidoRepuesto unPedido = new PedidoRepuesto(nroPedido, descripcion, autorizado, recambio, cantidadPedida,
                unaImportancia, unEmpleado, unRepuesto, unVehiculo);

        pedidos.add(unPedido);
        miPersistencia.crearPedidoRepuesto(unPedido);
    }

    public void altaRepuesto(int codigo, String descripcion, float precio, boolean garantia, int impuesto, Proveedor unProveedor,
            Taller unTaller, Vehiculo unVehiculo, PedidoRepuesto unPedido) throws PreexistingEntityException, Exception {

        Repuesto unRepuesto = new Repuesto(codigo, descripcion, precio, garantia, impuesto, unProveedor, unTaller, unVehiculo, unPedido);

        repuestos.add(unRepuesto);
        miPersistencia.crearRepuesto(unRepuesto);
    }

    public void altaImportancia(String nivel, PedidoRepuesto unPedido) throws PreexistingEntityException, Exception {

        Importancia unaImportancia = new Importancia(nivel, unPedido);

        importancias.add(unaImportancia);
        miPersistencia.crearImportancia(unaImportancia);

    }

    ///////////////////////////////////////////
    public Localidad altaLocalidad(int codigo, String nombre) throws PreexistingEntityException, Exception {
        Localidad unaLocalidad = new Localidad(codigo, nombre);
        miPersistencia.crearLocalidad(unaLocalidad);
        return unaLocalidad;
    }

    public CategoriaEmp altaCategoriaEmp(String nombre, String descripcion, Empleado unEmpleado) throws PreexistingEntityException, Exception {
        CategoriaEmp unaCategoria = new CategoriaEmp(nombre, descripcion, unEmpleado);
        miPersistencia.crearCategoriaEmp(unaCategoria);
        return unaCategoria;
    }

    public Garantia altaGarantia(int nroGarantia, Calendar hastaFecha, int hastaKm, Vehiculo unVehiculo) throws PreexistingEntityException, Exception {
        Garantia unaGarantia = new Garantia(nroGarantia, hastaFecha, hastaKm, unVehiculo);
        miPersistencia.crearGarantia(unaGarantia);
        return unaGarantia;
    }

    public void altaAnomalia(String nombre, Severidad unaSeveridad) throws PreexistingEntityException, Exception {
        Anomalia unaAnomalia = new Anomalia(nombre, unaSeveridad);
        miPersistencia.crearAnomalia(unaAnomalia);
    }

    public void altaOperacion(Time duracion, int codigo, float costo, float impuesto, Empleado unEmpleado,
            TipoOperacion unTipoOperacion, Reparacion unaReparacion) throws PreexistingEntityException, Exception {
        Operacion unaOperacion = new Operacion(duracion, codigo, costo, impuesto, unTipoOperacion);
        miPersistencia.crearOperacion(unaOperacion);

    }

    public TipoOperacion altaTipoOperacion(String nombre) throws PreexistingEntityException, Exception {
        TipoOperacion unTipoOperacion = new TipoOperacion(nombre);
        tiposOperacion.add(unTipoOperacion);
        miPersistencia.crearTipoOperacion(unTipoOperacion);
        return unTipoOperacion;
    }

    public List<Marca> dameMarcas() {
        return this.miPersistencia.dameMarcas();
    }

    public List<Segmento> dameSegmentos() {
        return this.miPersistencia.dameSegmentos();
    }

    public List<Modelo> dameModelos() {
        return this.miPersistencia.dameModelos();
    }

    public Marca dameMarca(String nombre) {
        return this.miPersistencia.dameMarca(nombre);
    }

    public void editarMarca(Marca unaMarca) throws NonexistentEntityException, Exception {
        this.miPersistencia.editarMarca(unaMarca);
    }

    public void editarModelo(Modelo unModelo) throws NonexistentEntityException, Exception {
        miPersistencia.editarModelo(unModelo);
    }

    public List<Localidad> dameLocalidades() {
        return miPersistencia.dameLocalidades();
    }

    public List<Vehiculo> dameVehiculos() {
        return miPersistencia.dameVehiculos();
    }

    public List<CategoriaEmp> dameCategoriasEmp() {
        return miPersistencia.dameCategoriasEmp();
    }

    public List<Especialidad> dameEspecialidades() {
        return miPersistencia.dameEspecialidades();
    }

    public List<Taller> demeTalleres() {
        return miPersistencia.dameTalleres();
    }

    public Empleado dameEmpleado(double dni) {
        return miPersistencia.dameEmpleado(dni);
    }

    public void editarEmpleado(Empleado unEmpleado) throws NonexistentEntityException, Exception {
        miPersistencia.editarEmpleado(unEmpleado);
    }

    public void editarTaller(Taller unTaller) throws NonexistentEntityException, Exception {
        miPersistencia.editarTaller(unTaller);
    }

    public List<Cliente> dameClientes() {
        return miPersistencia.dameClientes();
    }

    public List<Severidad> dameSeveridades() {
        return miPersistencia.dameSeveridades();
    }

    public List<TipoOperacion> dameTiposOperacion() {
        return miPersistencia.dameTiposOperacion();
    }

    public List<Importancia> dameImportancias() {
        return miPersistencia.dameImportancias();
    }

    public List<Repuesto> dameRepuestos() {
        return miPersistencia.dameRepuestos();
    }

    public void altaOperacion(Time duracion, int codigo, float costo, float impuesto,
            TipoOperacion unTipoOperacion) throws PreexistingEntityException, Exception {
        Operacion unaOperacion = new Operacion(duracion, codigo, costo, impuesto, unTipoOperacion);

        operaciones.add(unaOperacion);
        miPersistencia.crearOperacion(unaOperacion);

    }

    public void editarVehiculo(Vehiculo unVehiculo) throws NonexistentEntityException, Exception {
        miPersistencia.editarVehiculo(unVehiculo);
    }

    public void altaTurno(int nroTurno, Calendar fechaTurno, Time horaTurno, Time duracion, Time tiempoEstimado, Cliente unCliente,
            Empleado unEmpleado, Diagnostico unDiagnostico, Vehiculo unVehiculo, DiaLaboral unDiaLaboral, Taller unTaller) throws PreexistingEntityException, Exception {

        Turno unTurno = new Turno(nroTurno, fechaTurno, horaTurno, duracion, tiempoEstimado, unCliente, unEmpleado, unDiagnostico,
                unVehiculo, unDiaLaboral, unTaller);

        turnos.add(unTurno);
        miPersistencia.crearTurno(unTurno);

    }

    public List<Empleado> dameEmpleados() {
        return miPersistencia.dameEmpleados();
    }

    public void altaEstadoVehiculo(int codigoEstado, int kilometraje, String carroceria, String motor, String electricidad, String luminaria, String electronica,
            String neumaticos, String amortiguacion, String accesorios, Vehiculo unVehiculo, ReparacionEnEjecucion unaReparacionEnEjecucion) throws PreexistingEntityException, Exception {

        EstadoVehiculo unEstado = new EstadoVehiculo(codigoEstado, kilometraje, carroceria, motor, electricidad, luminaria, electronica,
                neumaticos, amortiguacion, accesorios, unVehiculo, unaReparacionEnEjecucion);

        estadosVehiculo.add(unEstado);
        miPersistencia.crearEstadoVehiculo(unEstado);


    }
    public void altaEstadoEjecucion(String nombre, int nroEstado) throws PreexistingEntityException, Exception{
        
        EstadoEjecucion unEstadoEjecucion = new EstadoEjecucion(nombre, nroEstado);
        
        estadosEjecucion.add(unEstadoEjecucion);
        
        miPersistencia.crearEstadoEjecucion(unEstadoEjecucion);
    }
}
